package com.yy.micro.magic.core.annotation;

import com.yy.micro.magic.core.condition.FilterCondition;
import com.yy.micro.magic.core.model.PlanSchedule;

import org.springframework.core.annotation.AliasFor;
import org.springframework.stereotype.Component;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/*
 *数据变换主要有两个核心环节，一是数据筛选，二是数据变换。@Filter的主要功能是数据筛选及动态规则匹配。
 * 筛选，就是把一些冗余数据过滤，使其从最终的结果集中移除；动态规则匹配，主要针对list类型数据，使数据与规则动态匹配。总之，Filter的特点是被动拦截。
 */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Filter {
    /**
     * 指定Filter名称
     * @return
     */
    @AliasFor(annotation = Component.class)
    String value() default "";

    /**判定该Filter是否匹配数据。
     * regular expression or '*' fuzzy matching
     * @return
     */
    String[] conditions() default {};

    /**conditions中的规则是否是标准的正则表达式，默认false，使用自约定的：name1#name2_n#name3=name1#name2_[\\d]#*.在匹配时，会对*做正则转换。
     * pattern is standard  regular expression，default false
     * @return
     */
    boolean regular() default false;

    /**指定该Filter匹配的{@linkplain PlanSchedule}，如果为空，则表示是一个公共的Filter，适用于所有{@link PlanSchedule}
     * if empty,match all planCode
     * @return
     */
    String[] planCodes() default {};

    /**
     * 如果没有设置conditions，则会通过{@linkplain FilterCondition}判断该Filter是否匹配。
     * @return
     */
    Class<? extends FilterCondition> condition() default FilterCondition.FalseFilterCondition.class;
}
